package great.project.common.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributeView;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * 文件操作类
 * @author zhangshun
 * @date 2020/5/6 星期三
 **/
public class FileUtils {

    private static final Logger logger = LoggerFactory.getLogger(FileUtils.class);

    /**
     * 验证文件是否存在如果不存在创建一个
     *
     * @param path 地址
     * @return 文件
     * @throws IOException io异常
     */
    public static File createFileIfNotExist(String path) throws IOException {


        File file = new File(path);
        // 如果存在返回
        if (file.exists()) {
            return file;
        }
        logger.info("创建文件：" + path);

        if (file.getParentFile() != null && !file.getParentFile().exists()) {
            if (file.getParentFile().mkdirs()) {
                if (file.createNewFile()) {
                    return file;
                }
            }
        }

        return file;
    }


    /**
     * 得到当前的时间戳作为文件的名字
     *
     * @param multipartFile 文件
     * @return 结果
     */
    public static String randomFileName(MultipartFile multipartFile) {
        LocalDateTime now = LocalDateTime.now();
        return now.getYear() + "\\" + now.getMonthValue() + "\\" +
                now.getDayOfMonth() + "\\" + now.getHour() + "\\" +
                now.getMinute() + "\\" + now.getSecond() + "\\" +
                multipartFile.getOriginalFilename();
    }



    /**
     * 获取文件列表
     *
     * @param path 地址
     * @return 列表
     */
    public static List<File> listFiles(String path) {

        File file = new File(path);
        if (file.isDirectory()) {
            return Arrays.asList(Objects.requireNonNull(file.listFiles()));
        }
        return null;
    }


    /**
     * 获取文件的创建时间
     *
     * @param filePath 文件路径
     * @return 结果
     */
    private Long getFileCreateTime(String filePath) {
        File file = new File(filePath);
        try {
            Path path = Paths.get(filePath);
            BasicFileAttributeView basicview = Files.getFileAttributeView(path, BasicFileAttributeView.class,
                    LinkOption.NOFOLLOW_LINKS);
            BasicFileAttributes attr = basicview.readAttributes();
            return attr.creationTime().toMillis();
        } catch (Exception e) {
            e.printStackTrace();
            return file.lastModified();
        }
    }


    /**
     * 获取文件的创建时间
     *
     * @param file 文件路径
     * @return 结果
     */
    public static Long getFileCreateTime(File file) {
        try {
            Path path = Paths.get(file.getAbsolutePath());
            BasicFileAttributeView basicView = Files.getFileAttributeView(path, BasicFileAttributeView.class,
                    LinkOption.NOFOLLOW_LINKS);
            BasicFileAttributes attr = basicView.readAttributes();
            return attr.creationTime().toMillis();
        } catch (Exception e) {
            e.printStackTrace();
            return file.lastModified();
        }
    }



    /**
     *  将制定的字符写入到文件中
     * @param filePath 文件地址
     * @param str 字符
     */
    public static void write(String filePath , String str) {

        try {
            FileWriter fileWriter = new FileWriter(new File(filePath));
            fileWriter.write(str);
            logger.info("当前执行了写入操作：写入" + str + "到了->" + filePath + "文件中。");
            fileWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


}
